package com.xy.annotaion.handler.kotlin

import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json

//object ProjectSerializer : KSerializer<Project> {
//    override fun deserialize(decoder: Decoder): Project {
//        p(decoder)
//        return Project("AC", "CD")
//    }
//
//    override fun serialize(encoder: Encoder, value: Project) {
//        p(encoder, value)
//    }
//
//    override val descriptor: SerialDescriptor
//        get() = ProjectSerialDescriptor(0, StructureKind.OBJECT, "name")
//
//}
//
//class ProjectSerialDescriptor(
//    @ExperimentalSerializationApi override val elementsCount: Int,
//    @ExperimentalSerializationApi override val kind: SerialKind,
//    @ExperimentalSerializationApi override val serialName: String
//) : SerialDescriptor {
//
//
//    @ExperimentalSerializationApi
//    override fun getElementAnnotations(index: Int): List<Annotation> {
//        p(index)
//        return listOf()
//    }
//
//    @ExperimentalSerializationApi
//    override fun getElementDescriptor(index: Int): SerialDescriptor {
//        p(index)
//        return this
//    }
//
//    @ExperimentalSerializationApi
//    override fun getElementIndex(name: String): Int {
//        p(name)
//        return 0
//    }
//
//    @ExperimentalSerializationApi
//    override fun getElementName(index: Int): String {
//        p(index)
//        return "name"
//    }
//
//    @ExperimentalSerializationApi
//    override fun isElementOptional(index: Int): Boolean {
//        p(index)
//        return true
//    }
//}


@Serializable
data class Project(val name: String, val language: String) {
    //因为有了插件自动生成必须关闭掉
    //必须实现 ， 否则 没有了
//    companion object {
//        fun serializer(): ProjectSerializer {
//            return ProjectSerializer
//        }
//    }
}


fun main() {
    // Serializing objects
    val data = Project("kotlinx.serialization", "Kotlin")
    val string = Json.encodeToString(data)
    println(string) // {"name":"kotlinx.serialization","language":"Kotlin"}
    // Deserializing back into objects
    val obj = Json.decodeFromString<Project>(string)
    println(obj) // Project(name=kotlinx.serialization, language=Kotlin)


}